package com.woniuxy.service.impl;


import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniuxy.common.entity.ChatMessage;
import com.woniuxy.entity.AllUser;
import com.woniuxy.entity.DTO.*;
import com.woniuxy.mapper.ChatMessageMapper;
import com.woniuxy.service.MessageService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;



@Service
public class MessageServiceImpl extends ServiceImpl<ChatMessageMapper, ChatMessage> implements MessageService  {
    @Autowired
    private ChatMessageMapper chatMessageMapper;
    // 查找两个用户之间的未读消息
    @Override
    public List<ChatMessage> findBySenderIdAndReceiverIdAndStatus(
            String senderId, String receiverId, ChatMessage.MessageStatus status) {
        return chatMessageMapper.findBySenderIdAndReceiverIdAndStatus(senderId, receiverId, status);
    }


    // 查找用户的所有未读消息
    @Override
    public List<ChatMessage> findByReceiverIdAndStatus(String userId,String receiverId, ChatMessage.MessageStatus status) {
        return chatMessageMapper.findByReceiverIdAndStatus(userId,receiverId, status);
    }
    // 更新消息为已送达
    @Override
    public void markMessagesAsDelivered(String userId, String receiverId) {
        chatMessageMapper.markMessagesAsDelivered(userId,receiverId);

    }
    // 查询对话历史
    @Override
    public List<ChatMessage> findConversation(String user1, String user2) {
        return chatMessageMapper.findConversation(user1, user2);
    }
//获取消息列表信息
    @Override
    public List<MessageListDTO> getMessageList(String userId) {
        //拿到所有聊天的人
        List<FindUserIdByConversationDTO> usersAndTime =chatMessageMapper.findUserIdByConversation(userId);
        if(usersAndTime==null||usersAndTime.size()==0){
            return null;
        }
        List<MessageListDTO> messageListDTOS = new ArrayList<MessageListDTO>();
        //遍历查询每个对话的信息
        for (FindUserIdByConversationDTO userAndTime : usersAndTime){
            System.out.println(userAndTime);
            MessageListDTO messageListDTO = new MessageListDTO();
            String otherUserId = userAndTime.getOtheruserId();//另外一个人的id
            AllUser user = chatMessageMapper.findUserById(Long.parseLong(otherUserId));//另一个人的信息
            //获取最新的消息
            String lastMessage = chatMessageMapper.findLastMessage(userId, otherUserId);
            //获取未读消息数
            Integer unreadCount = chatMessageMapper.findUnreadCount(userId, otherUserId);
            //封装数据
            messageListDTO.setAvatar(user.getAvatar());//对方头像
//            messageListDTO.setUsername(user.getUsername());//对方username
            messageListDTO.setUsername(user.getNickname());//对方
            messageListDTO.setUserId(Long.parseLong(otherUserId));//对方id
            messageListDTO.setTimestamp(userAndTime.getLatestTimestamp());//最后一条消息的时间
            messageListDTO.setLastMessage(lastMessage);//最后一条消息
            messageListDTO.setUnreadCount(unreadCount);//未读消息数
            messageListDTOS.add(messageListDTO);
        }
        return messageListDTOS;
    }
    //web端返回聊天消息
    @Override
    public List<ChatWebDTO> messagelistWeb(String userId) {
        //拿到所有聊天的人和最后的时间
        List<FindUserIdByConversationDTO> usersAndTimes =chatMessageMapper.findUserIdByConversation(userId);
        if(usersAndTimes==null||usersAndTimes.size()==0){
            return null;
        }
        List<ChatWebDTO> chatWebDTOs = new ArrayList<ChatWebDTO>();
        //遍历聊天的人
        for(FindUserIdByConversationDTO oneusersAndTime : usersAndTimes){
            ChatWebDTO chatWebDTO = new ChatWebDTO();
            //获取对方的id
            long otherUserId = Long.parseLong(oneusersAndTime.getOtheruserId());
            //放入对方userId到chatWebDTO
            chatWebDTO.setUserId(otherUserId);
            //放入ChatWebToUser到chatWebDTO
            ChatWebToUser chatWebToUser = new ChatWebToUser();
            AllUser otherUser = chatMessageMapper.findUserById(otherUserId);
            chatWebToUser.setUserid(otherUserId);
//            chatWebToUser.setUserName(otherUser.getUsername());
            chatWebToUser.setUserName(otherUser.getNickname());
            chatWebToUser.setAvatar(otherUser.getAvatar());
            chatWebDTO.setChatWebToUser(chatWebToUser);
            //放入最后一条消息的id到chatWebDTO，就是已读消息的数量
            Integer readCount = chatMessageMapper.findReadCount(oneusersAndTime.getOtheruserId(), userId);
            chatWebDTO.setLastReadMessageId(readCount);
            //放入全部消息：消息id,内容，时间，是否自己发送，是否已读
            List<ChatWebMessageDTO> chatWebMessageDTOS = new ArrayList<>();
            List<ChatMessage> allChatMessage = chatMessageMapper.findByAllChatMessage(oneusersAndTime.getOtheruserId(), userId);
            int i = 0;
            for(ChatMessage oneMessage : allChatMessage){
                ChatWebMessageDTO chatWebMessageDTO = new ChatWebMessageDTO();
                chatWebMessageDTO.setId(++i);//消息id
                chatWebMessageDTO.setContent(oneMessage.getContent());//消息内容
                chatWebMessageDTO.setTime(oneMessage.getTimestamp());//发送消息时间
                chatWebMessageDTO.setSelf(oneMessage.getSenderId().equals(userId));//是否是自己发的消息
                chatWebMessageDTO.setRead(oneMessage.getStatus() == ChatMessage.MessageStatus.DELIVERED);//判断是否已读
                chatWebMessageDTOS.add(chatWebMessageDTO);//放入队列
            }
            chatWebDTO.setMessages(chatWebMessageDTOS);

            //查询未读消息数
            Integer unreadCount = chatMessageMapper.findUnreadCount(userId, String.valueOf(otherUserId));
            //放入未读消息数
            chatWebDTO.setUnreadCount(unreadCount);
            chatWebDTOs.add(chatWebDTO);//把chatWebDTO放入队列
        }
        return chatWebDTOs;
    }

    @Override
    public Integer findUnreadCount(String receiverId, String senderId) {
        Integer unreadCount = chatMessageMapper.findUnreadCount(receiverId, senderId);
        return unreadCount;
    }
//查询最后一条消息对象
    @Override
    public ChatMessage findLastMessageObject(String receiverId, String senderId) {
        ChatMessage lastMessageObject = chatMessageMapper.findLastMessageObject(receiverId, senderId);
        return lastMessageObject;
    }
}
